package com.gl.glcourses.services.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.gl.glcourses.mail.impl.SendRecordatorioFeedback;
import com.gl.glcourses.repository.IEdicionCursoRepository;
import com.gl.glcourses.repository.IFeedbackRepository;
import com.gl.glcourses.repository.IParticipanteRepository;
import com.gl.glcourses.services.IFeedbackServices;
import com.gl.glcourses.vos.Confirmacion;
import com.gl.glcourses.vos.EdicionCurso;
import com.gl.glcourses.vos.EstadoParticipante;
import com.gl.glcourses.vos.Feedback;
import com.gl.glcourses.vos.Participante;
import com.gl.glcourses.vos.Usuario;
import com.gl.glcourses.vos.constants.Constants;
/* esta hecho el servicio de recordar realizar feedback, esta la parte de java
 * y se tiene que probarse y ver el tema de la url, para cuando ingresa al correo
 * pueda ir directamente ha hacer el feedback .....
 * y cmprobar que luego del feedback REALIZO_FEEDBACK 
 * 
 */
@Transactional
@RemotingDestination(channels = { "my-amf" })
@Service
public class FeedbackServices implements IFeedbackServices{
	
	@Autowired
	IFeedbackRepository repoFeedback;
	@Autowired
	IEdicionCursoRepository repoEdicionCurso;
	@Autowired
	IParticipanteRepository repoParticipante;
	@Autowired
	SendRecordatorioFeedback sendRecordatorioFeedback;
	
	@Override
	public Confirmacion crearFeedback(Feedback feedback)throws Exception{
		Confirmacion confirmacion = new Confirmacion();
		feedback.setFecha(new Date());
		feedback.getParticipante().setEstadoParticipante(EstadoParticipante.REALIZO_FEEDBACK);
		repoFeedback.saveUpdate(feedback);
		confirmacion.setEstado(Constants.CONFIRMACION_OK);
		return confirmacion;
	}

	@Override
	public Confirmacion notificacionRealizarFeedback() throws Exception {
		Confirmacion confirmacion = new Confirmacion();
		List<Usuario> usuariosRecordatorios = new ArrayList<Usuario>();
		List<EdicionCurso> edicionesCursosDictadas = new ArrayList<EdicionCurso>();

		edicionesCursosDictadas = repoEdicionCurso.buscarEdicionesCursosDictadas();
		
		for(EdicionCurso searchEdicionCurso:edicionesCursosDictadas){
			
			List<Participante> participantes = repoParticipante.listarAlumnosPresentes(searchEdicionCurso);
			
			for(Participante searchParticipante:participantes){
				usuariosRecordatorios.add(searchParticipante.getUsuario());
			}
			
			if(usuariosRecordatorios.size() > 0)
			{
				SimpleMailMessage msg = new SimpleMailMessage();
				Map<Object, Object> hTemplateVariables = new HashMap<Object, Object>();
				hTemplateVariables.put(Constants.USUARIOS, usuariosRecordatorios);
				hTemplateVariables.put("edicioncurso", searchEdicionCurso);
				msg.setSubject("Le recordamos que debe realizar Feedback");
				sendRecordatorioFeedback.send(msg, hTemplateVariables);
				confirmacion.setEstado(Constants.CONFIRMACION_OK);
			}
		}
		
		return confirmacion;
	}

	@Override
	public List<Feedback> listFeedBack() throws Exception {

		return repoFeedback.listFeedback();
	}
}
